From e27da1b4de1fc28234481742e99e24294066c21e Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Wed, 23 Mar 2005 08:59:22 +0000 Subject: [PATCH] bitkeeper revision 1.1236.1.115 (42412feabO-NbNx001J5keVzgy_QUg) Avoid unnecessary pte flags changes, which are costly on Xen. Also clean up XCHG handling in instruction emulator a little bit. Signed-off-by: Keir Fraser --- .../include/asm-xen/asm-i386/pgtable.h | 13 +++++++++++-- xen/arch/x86/x86_emulate.c | 17 ++++++++--------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h index 7e40d708d2..d932c6c17f 100644 --- a/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h +++ b/linux-2.6.11-xen-sparse/include/asm-xen/asm-i386/pgtable.h @@ -263,8 +263,17 @@ static inline int ptep_test_and_clear_young(pte_t *ptep) return test_and_clear_bit(_PAGE_BIT_ACCESSED, &ptep->pte_low); } -static inline void ptep_set_wrprotect(pte_t *ptep) { clear_bit(_PAGE_BIT_RW, &ptep->pte_low); } -static inline void ptep_mkdirty(pte_t *ptep) { set_bit(_PAGE_BIT_DIRTY, &ptep->pte_low); } +static inline void ptep_set_wrprotect(pte_t *ptep) +{ + if (pte_write(*ptep)) + clear_bit(_PAGE_BIT_RW, &ptep->pte_low); +} + +static inline void ptep_mkdirty(pte_t *ptep) +{ + if (!pte_dirty(*ptep)) + set_bit(_PAGE_BIT_DIRTY, &ptep->pte_low); +} /* * Macro to mark a page protection value as "uncacheable". On processors which do not support diff --git a/xen/arch/x86/x86_emulate.c b/xen/arch/x86/x86_emulate.c index 80bac2dca6..c7f752e776 100644 --- a/xen/arch/x86/x86_emulate.c +++ b/xen/arch/x86/x86_emulate.c @@ -668,18 +668,17 @@ x86_emulate_memop( emulate_2op_SrcV("test", src, dst, _regs.eflags); break; case 0x86 ... 0x87: /* xchg */ - src.val ^= dst.val; - dst.val ^= src.val; - src.val ^= dst.val; - lock_prefix = 1; - /* Write back the source (temporary register location). */ + /* Write back the register source. */ switch ( dst.bytes ) { - case 1: *(u8 *)src.ptr = (u8)src.val; break; - case 2: *(u16 *)src.ptr = (u16)src.val; break; - case 4: *src.ptr = (u32)src.val; break; /* 64b mode: zero-extend */ - case 8: *src.ptr = src.val; break; + case 1: *(u8 *)src.ptr = (u8)dst.val; break; + case 2: *(u16 *)src.ptr = (u16)dst.val; break; + case 4: *src.ptr = (u32)dst.val; break; /* 64b mode: zero-extend */ + case 8: *src.ptr = dst.val; break; } + /* Write back the memory destination with implicit LOCK prefix. */ + dst.val = src.val; + lock_prefix = 1; break; case 0xa0 ... 0xa1: /* mov */ dst.ptr = (unsigned long *)&_regs.eax; -- 2.30.2